/**
 * 红外遥控简介:
 * 红外遥控是利用红外光进行通信的设备，由"红外LED"将调制后的信号发出，由专用的"红外接收头"进行解调输出
 * 通信方式：单工，异步 (没有时钟线, 需双方约定速率)
 * 红外LED波长：940nm (还有850nm的, 灯微亮, 用于红外不光[摄像头])
 * 通信协议标准：NEC标准
 * 
 * 红外接收头, 包含:
 *      1.红外接收管
 *      2.集成电路(滤波器,放大器, or其它)
 * 
 * 红外接收头需要接外部中断, (∵接收头没有缓存能力?), 如果循环判断, 可能信号都跑光了MCU才开始接受
 * 
 * 本发送与接收:
 *      空闲状态：红外LED不亮，接收头输出高电平
 *      发送低电平：红外LED以38KHz频率闪烁发光，接收头输出低电平
 *      发送高电平：红外LED不亮，接收头输出高电平
 * 
 * STC89C52有4个外部中断
 * STC89C52的外部中断有两种触发方式：下降沿触发和低电平触发
 * 
 * https://www.bilibili.com/video/BV1Mb411e7re?p=38
 * 红外遥控&红外遥控电机调速
 */
#include "Link/LCD1602_Utils.h"
#include "Link/Remote_Control_KV.h"
#include "Link/IR_HS0038_Utils.h"

static void IR_HS0038_onReceive(unsigned char isRepeat, unsigned char Address, unsigned char Command);

void main_IR() {
    LCD1602_Init(1);
    LCD1602_ShowString(1, 1, "ADDR CMD VoiceNUM");
    LCD1602_ShowString(2, 1, "00   00  000");

    //红外 HS0038
    IR_HS0038_Init();
    IR_HS0038_setOnTickListener(&IR_HS0038_onReceive);
    while (1);
}

//isRepeat: 是否是重复接收 (遥控器按住不放)
//Address: 地址码 (遥控器的地址, 每种遥控器地址不一样?)
//Command: 命令码 (遥控器按的按键的编号)
static void IR_HS0038_onReceive(unsigned char isRepeat, unsigned char Address, unsigned char Command) {
    static unsigned char VoiceNum = 0;
    if (isRepeat) return;
    LCD1602_ShowHexNum(2, 1, Address, 2);   //显示遥控器地址码
    LCD1602_ShowHexNum(2, 6, Command, 2);   //显示遥控器命令码
    
    if(Command == IR_VOL_MINUS) {           //如果遥控器VOL-按键按下
        VoiceNum--;                         //Num自减
    } else if(Command == IR_VOL_ADD) {      //如果遥控器VOL+按键按下
        VoiceNum++;                         //Num自增
    }
    LCD1602_ShowNum(2, 10, VoiceNum, 3);    //显示Num
}
